package com.atguigu.tingshu.user.service.impl;

import com.atguigu.tingshu.model.user.UserCollect;
import com.atguigu.tingshu.user.mapper.UserCollectMapper;
import com.atguigu.tingshu.user.service.UserCollectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserCollectServiceImpl
        extends ServiceImpl<UserCollectMapper, UserCollect> implements UserCollectService {
    @Autowired
    @Lazy
    UserCollectService userCollectService;//从ioc容器中获取的对象 是代理过的对象
    //处理保存业务时：调用saveUserCollect1
    //1、默认：REQUIRED 表示有直接使用，没有新创建
    //   方法1开启的事务，内部调用方法2使用了同一个事务，只有方法1执行结束 事务才会提交
    //   出现异常时 事务回滚了。
    //2、REQUIRES_NEW  表示使用自己的事务，不使用之前的
    //  方法1开始了事务，内部调用的方法2开启了一个新的事务，方法2执行正常结束 事务会提交，方法1出现异常 只有它自己回滚
    // 预测： 事务2可以正常提交
    // 事务传播行为失效问题：
    //   原因： 动态代理失效！
    @Transactional(rollbackFor = Exception.class ,propagation = Propagation.REQUIRED)
    @Override
    public void saveUserCollect1(UserCollect userCollect) {
        baseMapper.insert(userCollect);

        userCollect.setId(null);
        userCollect.setUserId(1000L);
        userCollect.setTrackId(2000L);
        userCollectService.saveUserCollect2(userCollect);

        int i = 1/0;
    }
    @Transactional(rollbackFor = Exception.class ,propagation = Propagation.REQUIRES_NEW)
    @Override
    public void saveUserCollect2(UserCollect userCollect) {
        baseMapper.insert(userCollect);
    }
}
